﻿#include "stackplatesql.h"

#include "componentmanager.h"
#include "component_log.h"
#include "sql/sql_data.h"

StackPlateSql::StackPlateSql()

{}

StackPlateSql::~StackPlateSql()
{}

static StackPlateSql* instance = nullptr;
StackPlateSql* StackPlateSql::GetInstance()
{
	if (instance == nullptr) {
		instance = new StackPlateSql();
	}

	return instance;
}


bool StackPlateSql::Init()
{
	// 获取数据库组件实例
	m_db = component->GetComponent(Component::component_sql);
	if (m_db == nullptr) {
		log_error("load sql component failed");
		return false;
	}

	QByteArray output = {};
	auto ret = m_db->ExcuteCmd((int)SqlCmdType::sql_create_table, m_tableName.toUtf8(), output);
	if (!ret) {
		log_error("db add tab failed");
		return false;
	}

	return true;
}

bool StackPlateSql::InsertPlate(const QString& plateId, const QByteArray& data)
{
	if (m_db == nullptr) {
		return false;
	}

	SqlWriteIn input = {};
	input.id = FromQStringToInt(plateId);
	input.data = data;
	input.table = m_tableName;
	QByteArray output;
	return m_db->ExcuteCmd((int)SqlCmdType::sql_add_data, input.toByteArray(), output);
}

bool StackPlateSql::ReadPlateInfo(const QString& plateId, QByteArray& data)
{
	if (m_db == nullptr) {
		return false;
	}
	SqlReadIn input = {};
	input.table = m_tableName;
	input.id() = FromQStringToInt(plateId);
	QByteArray output;
	if (m_db->ExcuteCmd((int)SqlCmdType::sql_read_data, input.toByteArray(), output)) {
		SqlReadOut result = {};
		result.fromJson(output);
		data = result.data().at(0).toUtf8();	// 如果存在多个数据制取第一个
		return true;
	}
	return false;
}

bool StackPlateSql::UpdatePlateInfo(const QString& plateId, const QByteArray& data)
{
	if (m_db == nullptr) {
		return false;
	}
	SqlWriteIn input = {};
	input.id = FromQStringToInt(plateId);
	input.data = data;
	input.table = m_tableName;
	QByteArray output;
	return m_db->ExcuteCmd((int)SqlCmdType::sql_update_data, input.toByteArray(), output);
}

int StackPlateSql::FromQStringToInt(const QString& id)
{
	int index = 0;
	for (auto& iter : id.toStdString()) {
		index += (int)iter;
	}
	return index;
}
